
#include <cstdint>
#include <gtest/gtest.h>
#include <memory>
#include <string>
#include <vector>
#include "../rtmp_connection.h"
#include "test_util.h"

TEST(RtmpConnection, Connection)
{
    std::string connection_data = "030000000000891400000000020007636f6e6e656374003ff000000000000003000361707002000361707000047479706502000a6e6f6e707269766174650008666c617368566572020024464d4c452f332e302028636f6d70617469626c653b204c61766635392e31362e313030290005746355726c02001972746d703a2f2f3132372e302e302e313a3139c333352f617070000009";

    std::vector<uint8_t> result_vec;
    HexToData(connection_data, result_vec);

    std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
    
    rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
    auto size = rtmp_conn->PushRtmpData(&*result_vec.begin(), result_vec.size());
    EXPECT_EQ(size, result_vec.size());
}

TEST(RtmpConnection, ReleaseStream)
{
    std::string data = "430000000000231402000d72656c6561736553747265616d0040000000000000000502000673747265616d4300000000001f1402000946435075626c6973680040080000000000000502000673747265616d430000000000191402000c63726561746553747265616d00401000000000000005";

    std::vector<uint8_t> result_vec;
    HexToData(data, result_vec);

    std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
    
    rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
    auto size = rtmp_conn->PushRtmpData(&*result_vec.begin(), result_vec.size());
    EXPECT_EQ(size, result_vec.size());
}

TEST(RtmpConnection, Publish)
{
    std::string data = "0800000000002414000000000200077075626c6973680040140000000000000502000673747265616d0200046c697665";

    std::vector<uint8_t> result_vec;
    HexToData(data, result_vec);

    std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
    
    rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
    auto size = rtmp_conn->PushRtmpData(&*result_vec.begin(), result_vec.size());
    EXPECT_EQ(size, result_vec.size());

    rtmp_conn->Remove();
}

TEST(RtmpConnection, SetDataFrame)
{
    std::string data = "0400000000021f120000000002000d40736574446174614672616d6502000a6f6e4d65746144617461080000001200086475726174696f6e000000000000000000000577696474680040940000000000000006686569676874004086800000000000000d766964656f6461746172617465004099954a0000000000096672616d657261746500403df85452cec4fb30000c766964656f636f646563696400401c000000000000000d617564696f646174617261746500405f3ff000000000000f617564696f73616d706c65726174650040e5888000000000000f617564696f73616d706c6573697a65004030000000000000000673746572656f0101000c617564696f636f6465636964004024c4000000000000000b6d616a6f725f6272616e6402000469736f6d000d6d696e6f725f76657273696f6e0200033531320011636f6d70617469626c655f6272616e647302001069736f6d69736f32617663316d70343100057469746c650200265370616365582773204352532d32313a20546865204669727374206f6620697473c4204b696e640009636f7079726967687402005d466f7220636f7079726967687420616e64207265737472696374696f6e7320726566657220746f20687474703a2f2f7777772e6e6173612e676f762f6d756c74696d656469612f67756964656c696e65732f696e6465782e68746d6c0a0007656e636f64657202000d4c617666c435392e31362e313030000866696c6573697a650000000000000000000000090600000000002f090000000017000000000164001fffe1001b6764001facd1005005bb016a0202028000003200000bb5078c188901000468eb8f2c040000000000120800000000af001210000000000000000000000000000006000000000414090000000017010000210000040b25b84005dffef527f814d508444be16b61edd4b74930d170b12db3d000000300000300000300000301f58bffdbec6fbb8f3837a4bfc0f25a0bcb2a848b39c0bfc203f63666bf96f1b5e64005f3979b728381c0e070381c0e070381c0e07d6ee070381c0e070381c0e070381c0e070381c0e070385d7703c681c0e070381c0e070381c0e070381c0e070381c2d50381c0e070381c0e070381c0e070381c0e070381c0f6f8e070381c0e070381c0e070381c0e070381c0e07039378e070381c0e070381c0e070381c0e070381c0e07039278e070381c0e070381c0e070381c0e070381c0e070391e40e070381c0e070381c0e070381c0e0703c681c0e0704fb70381c0e070381c0e070381c0e070381c0e070381c250070381c0e070381c0e070381c0e070381c0e070381dea381c0e070381c0e070381c0e070381c0e070381c0e39870381c0e070381c0e070381c0e070381c0e070381c728e070381c0e070381c0e070381c0e070381c0e07037871c0e070381c0e070381c0c6e070381c0e070381c0e06ee2381c0e070381c0e070381c0e070381c0e070381c0de1070381c0e070381c0e070381c0e070381c0e070381bc68381c0e070381c0e070381c0e070381c0e070381c0d60070381c0e070381c0e070381c0e070381c0e070381ac50381c0e070381c0e070381c0e070381c0e070381c0b2381c0e070c6381c0e070381c0e070381c0e070381c0dff2070381c0e070381c0e070381c0e070381c0e070381aedc0e070381c0e070381c0e070381c0e070381c0e070030381c0e070381c0e070381c0e070381c0e070381c0d74e070381c0e070381c0e070381c0e070381c0e07037fec1c0e070381c0e070381c0e070381c0e070381c0e0c66c770381c0e070381c0e070381c0e070381c0e070381c0120e070381c0e070381c0e070381c0e070381c0e070368b81c0e070381c0e070381c0e070381c0e070381c0e00981c0e070381c0e070381c0e070381c0e070381c0e060870381c0e070381c0e070381c0e070381c0e070381bdf70381c0e070381c0e070381c0e0703c681c0e070381c0370381c0e070381c0e070381c0e070381c0e070381c0c68381c0e070381c0e070381c0e070381c0e070381c0db8381c0e070381c0e070381c0e070381c0e070381c0dee381c0e070381c0e070381c0e070381c0e070381c0e00c81c0e070381c0e070381c0e070381c0e070381c0e06781c0e070381c0e07038c61c0e070381c0e070381c0e06ce70381c0e070381c0e070381c0e070381c0e070381c02b0381c0e070381c0e070381c0e070381c0e070381c0c60381c0e070381c0e070381c0e070381c0e070381c0d94381c0e070381c0e070381c0e070381c0e070381c0df7381c0e070381c0e070381c0e070381c0e070381c0e02081c0e07c60381c0e070381c0e070381c0e070381c0e0d9a40460000210006c7092701000021000006be21e21c8d7f91cfbf81f207ce081859b93bba2a3bada3e78fd70085db26b3e124337423a0796e51831edad1851e5ce2695559e9c528d35f9c7b6bc7e2f32dff9d57af82165c67051b90fbb6d05a64748ce8048a87a767544127d1c8f23b5937a3326cf41b021e2b6c9e89cbe6c039ec6d702850a1442217c6b518df0d6e3313c5370a84dc39c8b965ace8abf57eb0d18ca92d3025702850b69d9c8a11073ceec6aef62850a13d5c5589e49e2de908836b81428472142850ab93b7f77447c252aa9a0276d6671e0b3166294142850a14285303688a751a719b5f22ee7c7cd42ece52c7c508f51a670eb71412567400a95fb228142850a13c2ec61ed8fcbed6e4622d70a6b147f03bfad8dcacedbc5fd3eb7cb415ff38f93b47f82e27e4565d47a5a302924cc2ca5974dc2729bd6deb6f56fadbc7eaef13925a96deb6dc06f5b555be6ce932dfef5b7adbd6deb6f5b7adbd6deb6f5b7adbd6deb6f5b7adbd6deb6f5b7adbd6defef4af201bbb00765da626d9266e6cfe10fc856cc6cb7021da92112282c9ed1aaf67bc60513924c9a84d426a13509a84d426a6d8b375909766b540af82eb064c533514fb1c81f468997ecb0627320aa9618f509b95edb7adbd6deb6f5b7adbd6deb6f7f7b3c37777ea427f7b2eb252d4146f60d8286bb8fdbca441552c31ea1372cb153253ae4aaef7f83a113baea7bc2eb0ecfd11c6aa65fac4d4ce2e3312e5c4d1ea24eeaa79dad287e97c1eadebff8248ff79dee57d5404a635872e0453eb0e7216dcb868f8013f7ef29d871dbcf3bb1abc0a0e2eecb85218eda176ab0bf3ceec6af611e3b1fdbb157d25ba70db0e8142850a14284e210a142850a14285092e21519d0b87de142850a142850a142850a142850a14c62850a134d0c9c2e5bc53c5bd21106d702850a142850a142850a142dc0689d0662a0de2ab87237168f937c2142850a142850a142850a2ed2c31fcfee4c2626522ccf4a17a6819dd8d5e050a142850a142850a5b1b511e0afa71ab362553dc226a743a6db0c22f02850a142850a14326fd378d528f5c931e15f7267dc2d4669767c6cc324dce45b610a142850a142a7cd8d75cb3a0c3fd5e77635803ec910a75d06339c8b6c2142850a142884a8239ff590ca31222941e485df4b23118e8c6ccf81fd109d0e5e29ad7141eb52989678d9cd8f3f0e31e0cba843045d07f7e46e5f3c11e9e9e19d8db6d796e48b4c1512e06b28c9f107215475d610d924788cc3c0af6c693016652cbfaba329cdef4ad8d059c3bca57ca66ebf899eaa57a276d608db967899a04f8c204ab9aa00694fee1f062409c58f8abd7b0feda9763f72a5a079aa87cadd6a74cdd9c85cd22429bccb808b2c5fabd9b95feec7d4e9f59a55dd9c7b92c5abb9c357eaf55fd2ae1dc244b3bcaca0b8f39de2fea8c386b2ce42113d12cc6e111fcf6b4425964f2cb67b1d1e849c98796a9a94e7701466e2a7de19605d030465d82cda2f59c2d321c8c2cca6985b3ab75e3b535d079297548a34dabb43a4d691d058b17216bc6f6630b5bd48ea40dc2b0945ac0dacf549e957e596d66b144c784340a125a1be601800417fa616781428509f813513deb284a0670ad4a8220c60da0e7a5ba56ea5adea46148dbbb7551415ca28ad0bdb5de30dbd7bdea1b5d0a0d9ee9e0a609cf9ba3d835bd7544e063edf5da342671fc220e79dd8d5e05bb3d7c330fcbc6be7ccb94d82ee6be74d1f30fb1451518aa3bb1abc0a142843bd01cc28445ffa616781604212707955a51a3983d6e0765fadbab01bd39f1de63f26fc6842850a142850a14285bab45880bdd9381f1fa719ce45b610a1428583acaa7de3d8337a6628445ffa619c8887c0a9724132c5c85aa8e908836be90438f014792b6aa94e27ea47e0c282ea5012965d8c73446260444e1aad3778c58de45c85abb0ec2b64b6cf429fffe0fa45beb1525a09edfce855b252c99fd7170da8098119bc6e78982f61b41f33d1e79f5d177f8e1c63ab04b8b1f09e9f43a19b4c321e672fb9f82e7ab2595cc727b1b880b9175e92ecd1416672f3991cc4903ef03bfcd4906f0fad66fc128d88b90a8b2012731be380e192439ed9aefa4a93c46a1bef368d78bda32246b995ac7a033af0eaa2ec1db011e5d44e8baa4ef6476fbad3a7c6111c6e38a445ef4e8721f5b7945c60d9d60c212afd9b5f7a96a220fa296e9c6f29f98cd37584f92282a19b50537bceeb348168b0f6d291a56578467736549340a3b2a688162cc54904ff88a83a9197a2f54a02d2e95eab26f10a966fb22c6c722ce5b124385df48841f133bf24cbb9c4eec51610142850a1428438842850a1425f2d0c6a142850a142850a142850a142850a142850a14284fd0a142850a142850a142850a142850a142850a142850a16f507616aa3a4220dae050a142850a142850a142850a142855c76e4400002100017508af0121000500a01bffc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000000000000000000000000037a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b4400001700017608af01211a931a7c6080000002000d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d8046d88b5b116b622d6c45ad88b5b116b622d6c45ad88b5b10ec69f182000000080036011b6011b6011c4b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b6011b622d6c45ad88b5b116b622d6c45ad88b5b116b622d6c43ef8a0000000000000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef4600002100084c0917010000220000084325b820025ffede23c0a60e9f45d573c6f9e031f156ee9b471cee3c23687c5d40021fe08038a0620257ae51b947734181792df8ca144933da839b0400961b8de22d939b27021743c344b45b1a3d480d35bfd877058b632b26ef2867fb48d7d998546f05c8345af98048e8fe791c18502b3e455a633a33a5c6c05e05e22eb168564a3a16f60ddf7eca169f9673289cf8483ecb85f14e5ebc1594c8f028baaccc4db94bfdc185a4766d8053e2cccfe435d614d707d1b9d62d6e9c263706ca1c4aabf661c8e20df48361c4473725c6c6fc9cad29e5d64fe9a9c7076db6add77de385640aca9b03403b9838166487ae57b6705fe67864518b1033c6c6fa59d6e5c18ccd4dbbf158ad1c14a7ff921cc3bcb212bc22311aecf7be213e7840d1937c87df624a007c77bc41bee8991febc05964679e86d4d41f4f509901fd64785f8bc0a3240138b86041287379342d8679b5b8525e5d63e1377e93705abffd46800bb73e7839a2341fbfb76841af46e7cfe20126a670b366de99b7533dc6b6a69ded444e37ec30453ffa0d84e578aaeb678822e4e6b2396ce1cb48397e2f32a2f40f0d783862db0aa777702cd701ea0f4252cb646455e8eca4770d2dabd91801157598a34b571426fd35a42a4b94ab9fb6de8e29e50b0ebfad28bccfb6187d8eec2534c17ef771c0313143c27ebb66245c6ae1e2d67bf56b6868d29deaf2c63305546775936554e4c4d394bf56d240572787abc2be3860cb29afad85a9865c67ba7f883350cfd1301f5afc015efa57f096c757ad766c60ade197f4e97d2e66cf6d124a4f25d565921dcf774c5e250a5677dfa52ea5bb46b7d0cf1bf1e6e087e0415963d4f2dc99d2aefb194dd36420fbcd51bb769327e7aa8852f622b49a12c6e5fb6b5a9a548ac3e5897098309a14d1d54e49018b035943accdee1d2a30868c731ae6464e93bf9d54e333cbafe3eadd013a18196f878cc95470bf04cff237d9f810f47931bec73f6700eee2153917c97b985ffe03230718ad24120cbda26b5cdfcb5baba3061c8632831a763a9a2ebc642c5d04303c2132b7de64ba0e6aef96c66625840684bd099813f3150457457c00e42fae546afca790124e50e648cc5fbd142f92ec04d9971e96567bdf1abd740ea2854b1d1b0b0ada50d51697b0987e12fcb4cacfd88d61af40727b639342bfa1b68d6db1a90ebaa4cd902d71d10615813a278346b887b04945994251257f5a4876beddf50484da86a64c93612ce1556dc668166a436e91d14b85f1cf1426ab2396f8fa27cd153c965b877ce25e5ae09582a6b025dbda182b2331748e4ac8835a5d80e2c11f374c258896fea5245b7aeb7cb54f79e836329565abeae5e4640617ce79e6899a19d713606e12952922725d3645663914dafd284efb09dd2e337db5d83530c200405db140f6eaea7110fbf094c60a94655d4e00e34c4b8a31654e9cd4e0f0b8289a66782181cf4377ff65d35a9e765a7ca5d134be9ec4e18c1d26cee722c046b84678d3e201286d7d60134db324fce349ec6f6a8eeb2997e65aaa57a04f394dde0c56a23eb5eeef2f072f22b69c7f325b3fe6c38c5f2f6ca10d6721f34f644d141b00340449fd6b2c95813b32a9c65a76fc1020b63ca2120bf949fa0117a3dfe9c2cd25fc0d51a3127c7d98701909847cbcb498c65d6321e23eebab5b4858c61bdbba4272c2d357586edf358254d82a315b18d788fa12800627c5efa41dcaf86027afa2936ae6522f13e4f9897441e6d57261284945766855a70b52621bd972c34e3ac80c2c3116f7e6445374e0d3c647393ad7d766112d6eb6021022997722dc2865f3dd6eba08c81016fab6a7b070071c578b6b6b06e574ddd8ee6a9306a3f6889bb5bbafeef2b4b5182683e34de750af1dd8aca5804e70c19808501db12a204421a0a0e85776fe0c5b603901d912ea2a069f6ddc880f7002277169377da8ff4298bfdeb75b39bd32d4275116f56bc6d96c1237f0c99bb68ab542376dd0d972e7738b2358056c59c6b81a4f37d8cdfa4b158fed2bec79c0bc0f134942f35b33b7a1063d0c2876a35d5bdb4744a91eea74233f4e07e1db9c30ce0eb7a93a2ae9399ef5aee84ca780aec05ed84dd2ce51f3fe5a22ae006dcd718d320277cad2f7a6dec52c5f6e25fc0393dc6a78175512c62f4b3c57b34ccfae59b43f4bbca4575582e06ad8e59f3d6229ad42f22af7a44773fcdaf037dc096b2699c4f56de527d65be1eec9f671d1c6cea03fbda87373ecdbc11eaa58cb88893e409ff1f6631d5dacd830fba2acdf6cad0e763985ee9aea695f24dca2de940e8c68cc28daa5f42358eed8c2a2e39e7dc7fbcfa7b6507188c6cdad6007687c54ea3c04551e0ec6db4b6fd064c22384b1234f661627523b6fb7356e1a273483082854f584060378b12e5f568b8d2dc52fc06cb5e2ef8f859141fbe7da38c17d98a0d0941758c90638e39e3f7cba9d21210a20dbfc8b501721bbfd59dfb0f604e8181cfb5a371e9ae8f5480d8bccdd8f63cf0c0a116d46b935d9c6f29fead4a114860e4df95f346e8df5de108d5a762d8f0d5979e9c59e2669d20a3b38fd654eb95fea6ce7e3c142e616d7904e6cf692e79464b879ebecd28f5f9238feb521c7982b265623909fcf47645d850932a1453cdbb4de98737763aed0abc1df4ef9fb3b09c06a56b461ea330b5dad32b9686fdd5104e4c28ed1030b4ccac66e638443701d1bfa2dbc4157e0a4d1b448df67096c1193eefd884ed7702a6b358c8914622390281dcf7cc58c30e5830515a3a72a199d9298d1ea7c97ac4f3024fa68f1126b3c1926ff7ea6b031a84e264452e9798bea199a381bd1374ce48a9c0d46145aca1fd22bf3fa7c628c62af0bb95638204e021961ad254a97b4a1c469c6fcf8e295b3cb1d0f546c61278cba25d3c322631aff73beca69ac90975d6a5fbfb186f9174da74a17febeea8a8adf923e64b73484da8357b25030005c4591e6c5c8287cb4f9aec44b8293df68";
    std::vector<uint8_t> result_vec;
    HexToData(data, result_vec);

    std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
    
    rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
    auto size = rtmp_conn->PushRtmpData(&*result_vec.begin(), result_vec.size());
    EXPECT_EQ(size, result_vec.size());
}


TEST(ServerMessageToClient, Message)
{
    std::string message = "0200000000000401000000000000ea600500000000009a14010000000200086f6e537461747573000000000000000000050300056c6576656c0200067374617475730004636f64650200144e657453747265616d2e506c61792e5265736574000b6465736372697074696f6e02001d506c6179696e6720616e6420726573657474696e672073747265616d2e000764657461696c7302000673747265616d0008636c69656e74696402000841534149436973730000090500000000009414010000000200086f6e537461747573000000000000000000050300056c6576656c0200067374617475730004636f64650200144e657453747265616d2e506c61792e5374617274000b6465736372697074696f6e0200175374617274656420706c6179696e672073747265616d2e000764657461696c7302000673747265616d0008636c69656e74696402000841534149436973730000090500000000001812010000000200117c52746d7053616d706c65416363657373010101010500000000002c12010000000200086f6e537461747573030004636f64650200144e657453747265616d2e446174612e5374617274000009";

    std::vector<uint8_t> result_vec;
        HexToData(message, result_vec);

    std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
    
    rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
    auto size = rtmp_conn->PushRtmpData(&*result_vec.begin(), result_vec.size());
	EXPECT_GT(size, 0);
}

TEST(TestAudioNoBodySize, Test)
{

	std::string message = "4400001500014708af01211a94f5d690c4438096bbcbcd2f8e1ba3cbc38b5205738840d2444affdf058be4acb13dadb7e4f61250e6ae073a4760d0a19f5f9f25799233cb5682db919c71475c63a962346c5fc418ac864b4776b91736cf9e3a7553cf49c50dae264880c63876eecf27d4d3742add0478fd6944d11fb927285d7c476ef5d545aff37cc4605761b9d7c9d0f5d606c8674d026717f99b159736fcf9bbe672d3b4f336ef8d659d36ac2315732066b7ceabe3a751afd4388754e5af693ecef7903917e1610df1f0968b772668938dcb16956f21efe48f14db300d10ee55f9b2910d5f17a3b140f3efd1d9a6e8e1be34597f658b2abcf90de2b3b1000e5c6ee98f3c18f5e84dc4b37a27d69b6eab651925b7f974fe607bef1dd95fd1d2014fd1568b80f20017a0637a8df26399edbee0febe49cc1c3101811063ffaf6c03c7e173de7f8d4d35391a6dffebe78f80c4af01211a94e5ae8b61a25868ec501214022e499797f7677b7d5bc3ad50a4acce55781d9824bb6baa9d19bb6d88090bad6290925d818dc698ea488ca33b5484f12c774cfb697cc67bde8304932534c09892a62012a43042d0c46a1d4ca005ba50249e2583582b3bf1152912edbfb054c20c22d88b5b4c27693e5499a59babc837c4cdde7f9fd8deb2cf1eb6fbb63f47ced9725652ec3b0674e63709846feffb3cb8856a0280c3083bcd7e06b6f79df24bc5ae70365691baedb7355b80a2555b5ece3c88c4ae448148bd60b1b353c3f38dba6bb7660649305475985b5fb94aeb992558c17f51c2bbf1dff2cb5eecf8ddc2325b1607054892f96a443232457b27d9c2c49a3bf2a7986953d795ba43bca885e94f144da4e6cd37a80fe09c7095d91ea582aed75db92a424c1c61018050e47dcb8003d1fbe1358c68b50118dece8696591cd18c9b7548ecdc";
	std::vector<uint8_t> message_vec;
	HexToData(message, message_vec);
	std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);

	rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
	auto size = rtmp_conn->PushRtmpData(&*message_vec.begin(), message_vec.size());
	INFO("result : {}", size);
}

TEST(ParseResponse, Test)
{
	std::string message = "4400001500015308af01211a8ffffffffff131666259e8961a158687045130906230e3edc2d3db555cb4c95c223732f965ca57619f081711590ac677fd5eb297b06d2ca3e57b9b5aa12d7d39b8677349d22053985c922c37177eb1952b0a2b18c13b0b3064410e39ec820a9933221cbe3057159af94e14f7601d16b1d90d8f4d36d4891354a46c94c481e8dc860da31f24ea39399adbd8193fa5218167a273975932852303e3d74d94a00d50da336cdbe03cb473cb2a9d66368b3aa09234e067d8c849159caeb59ffad6a53f1b223b74ad6b3712aba94fbba0fac731612d36cb326641821cf4d800b02c529cb1852d092171c013816ac14dcc4346ae4b52b8e09bebf57755ce18bc19c420067169679562d44260b89bd751b04921d33bc8b8e36cd5301695022df043750d7ca9bea530d1d489aa99a156b8a5c1f0cb7ac8aa80e8012aeb0e08c1606c2bd26003c7e10035774c7242884e6a20862e801c4400001600015408af01211a8ffffffffef12b6ba2d868764a2b0cc686008b55d15766dd5a7bf56a0a6dcdc872394c9e29e4690ab091dff009fcf93c7e7296d1790c9ae5c2484a28da58341449720108e063e6116a494784d3bd3c3e791ac377ae76fb5f743b8e34496ba20a7926aaaedb18c66c8f71fb39b0d4831360d7aed479ed30e7c2bbcbb5c49e96d8d30eabf5190f40636692c0297c71116f77a1ebea4440f2c564793b460fc566d030ca1f6ba629a096ee9d90894bea213a1930e161cd565e800efa1ea862393fa444435213089db2a4edf4670d715833b08808013cf3365c6864bd82d51535447007b3be244719254843ff2262f852d8cd3505ff7b847d7683166827bfe6c4f6223c5d489238ec67cd92db52f8785497176c3e933ad37080b7a2204969a888b50315a812ee6bbe7771c696176096730710204410041d1c89e7d101dcfe4aa24ba2a97298701150a547f40fe19ddc71a585d838460000220020030927010000850000000209f000001ff4419b734ba8416d4994c022697f12c44b77d64bc643930566526468f93a60cbfbee8e27b3a320eca55bb341deb69e39be27ac30e76f04e46fcd8de6a42aa0d5b9bcf7fd13d04251386aca5b41a3fed6173e3f204586aaf2413552c8384fbebb8fd5836496f80210422f2e857596bec90818c6fdbe0f1ca2b7649dd0438b4a8652852e8db6df0f391485d30891219ee41f432268ce4b78a30d95c3abd884b598e863dcf78f91cb58725a86717a24baef7bcc473e956299e09558550b39a78e69b3391da8d264d291ecb9ef8c31aa753c49b1f9143b81b2be173c35f2a0da73be87576f71b31dc181a4f287e06103108ad3eb22c6aa8e7ddfe4c9b46d612232fbd76193f98ab00c56d0fba39931ab8bf2a70b80ec288287c1bc4113b8b411e74596e4a22d1fe26979dc16ee266d07033d6348c9f9040a0173a1a91f6c4fdf594940dfce421dc2bf1798dd30e0b1cbfc05fa70e33f65baddee5773d420052d6f0555090dbb66ad4d680ee2b44d88e45b4f3aa61305c689cbc936dd45eec535ad9962789271fac030a43222d4d33486c2436d9a9541fd6a52e07631729337291dde304cd7d3509dc80dd51c739bf29768a393a974bedaaba7a50236b558147e60f05fb90bd43908ae2a3b8ad7bd07b88e2dbbb281c755349fe86b770b19aa3e73a72886bda05d8c402e71c0582c66ef19482fca1b2ddbc6cc4e9438eb705b6d746a38629786df1452cb27054be8bded38c10d5ec760280ad3d94bf35cecbb4936bbb7da0eb32213cab2cfd9fbb4f4bd058d6794d0a36ca76353c2387361ba67ef8695923dc27787d8612faa363cd48efbdf5e7d1a99838d64bfdeae409c5fa09e6165fc35f25999ea3b800f199e6ace8a51800d758a3c7cc61549fe0339092de08d5c1f7d89a49f1bc77f2861aa100bef02b6fd82a97ce449ee247f926a739d5be0c1c196bef25bb23f00b8e55bd6bef8a0731f37844fb5802654f9b0ba6d6e38444cd23896ebafcc8d4b55ca94606e22fe48c155844c06a35f39a88bd37a94f99e0db8869a6e3bfbc3fcac964b86e149f05a3019091dda6dc63ce6ed709e59f27ea4bf943304fefbf7634a81b05afe435017897c2256de6a600c42b3cfc2d677280ea78c4e7f384bd005cfce65a3779bff90b89bf6dfa1e6f9a7c67f298574e018b7306498959971838454efcc1d84625dcb271e56fa7db2bb76d0bb2457980629a6974eb53dd410499f5d8a38c0ff4664bf1eec98c19fef53c6aa5cc0560ebe8dbc74ebe32b661bf5cd964ab33244666927977030550d594e97fad33d9c90f7f2a819da4e0f35552ad890badb865245f26732f02346927c3374894da700cd2a6fd8eb72055af3d69a0920fb092e2fad7354b3ebc16bf3bf7c465de85aa64bb62d510955ecf60cbaba3bf3f640e82b525e44085f591a5fe27545c667285b69eb527a868af4ee33a6bba289d6f15959e57e96f3e069d45ca8834748519d188f6a365499c681055fc9e001e13b04a7fc2e290ad1839243b15a3cdf7a0f2f558ee85c60746236f8663d62c0af0ecdb55dd294120399e59b57527cca09ea0628340cd506941c833e5a178c1a72a6431fa3898ed1b5bb35b1f2980c5eddc618cd0b9822efe092b7d89a602fa91897ab7d6cb8370b42c8904ec980b3cc4565796897c34d274bae70ffaf82109d05669e9b38adb8400079b916a624b07cb7b8cc598353b5f5bdf86d607257f47986e9a9dad81282b68a193b0b7fea9b3dedf81cfdbd8761ed3832774e853dff0df7901c673faf225827efc0422d8215501cbdc6750fde211558af1614462fb414c84eeec3f3435cc47a0ffeb4e07fa7d1071815e085d93690e44a8dd473e467dc542a7bdcce73f1178fc364ef41dbeae39176dc54629c3e475ede515110ed8883a7244b23f65c42f5225ebc56c242296e7b38916f28638434579fa66eb95f2938cce1391e7958c4eab2577f4686c8365332f83fc6577bb7f666a5b4e23eb4e51cab6946c22e8f04ae135c13e3605531218647fd0b20438579aece2bbc66ee34edd60fea8d56fc9f00c3b6dd772a673e2e5dcc31bbd8eabc74a7b20bfbbafd189af5540895fd7b820694c4a120798b35b8258090e2855ddace5d5b5001e92353199b0992748938be77d4f912ef27bb5fcfbd5c6b0dc6745abbf23d9d64291fe62ed89661a171d7a249ff473e5ad0b13a5d88272986064c631ef6f5b4912be17e97cea5ac8e63ac6d9376f8f7ab4e813a991a9efcae38bb6f7b10f87b4ba17fc286b323555b3d2b3c559f32039f3bd5347b055346780d011de323a9f16186856a7918bd49a5b5673ac0e3a0cf309dec8651b9b397d002c6ac68ddc0eaccb839606ae17454c6df54cc65f9a6fb1d18310d48fa714a4c43f6b4b3c23805748a940fce2c85a584c1658fe8355a3349dd78856afd54cda42458fcaf3c6ef210a74535adf2ee00d4b96d1602250d62bc8ed836d6d2d8773936ae71589ccf925b7dd4bd75ddd834bf4ae89b6452e1aeea16265850b496a326e2e7c67a1cf52a885764841028426e2fa8f1df05cfd0de15d67b6ab26b14385fa549c32524be07b18184e42aae1653d7bec3dc1f142f15040641d064a3105ae76dfbd8fa99f0dfbba835e980cc77734c642818c90fd57087aa67e7883536070460cd4ac2db6b2ae5327578ee262bc4cef1668e23f2bfdc5a93ef9046e1771f92a16dc6c657ca970438f83abacb54f69f1b9dcba01204492d9551b267dd221274800a2e2c91f9533d76a382381eee0558549cb677dd5133f6f337b2701d02ff79260e36b531d7026601de2d3e20a20307c66aea6351e4f9d628b9f73883593f217f39e80eacd24ed78fc1e467b83f5578ddd01ee04f9171ea8cdd0c264800612865c9ef00c6526bbce078d75e36512b42cf200d51ecb73e80c0a22ff87e323357d226f9e43081b1bef7a15c7fec56ca92a6438c78a9e32cfb956d8b5fce3ea7d53c46b51bdd2e17c0453f61b4a0cd19dab8f368b57dc814f0ab74909019c0fffc8366454e0b0e68afee5869d35e5932908c7864a1828b6e8ddc1fa04cade017697fcb4ca5fec6fa9f65eee8df751c3c8f76687db223571cb0ae36c9d9adaab96d1bf48909a7d985ec21e62b480038e8508aff544b225b3c41ef3aa6326c864455534818120d682cef8de08d28cfe879c9dac14c73e787f2a29b1f3acec8dd66f90700a3f86d6f40c82a25eff860df0ba4cf7a973d956d1fa070729066562619d160620df349e5c64d00c8bc66e9f4ebeceb7640d6a3636fa18a3070bd42e658fa852564c13e39e4351075c1dfc29282355139133612ecca28b0e232fb0f44ae9f92a6dd54df526bfd0f0b0c4c7e0bb35d1cd930298c83010b819049879c20b36c10ce6051e4b5eb988f90cb88dd946cf92f01165d854fbe521ccc513361f9a557119321cdf74647c67dd160299fd063fdc0aaf8ea91abe566f9d3915a30cd687c582afe6ccc813fd4e018bb23f0e19369f1a419ed5ef20dba4ff5d005040deaddc884c1340d77c1435abfa4e76ed3b2a6220cc797a1298e044573a08d026ce8d5e19f4ca5f8d63a6e2c3ae431f16f4f896e4ba586b825d67fbfd5b642df8d7520e81b9f490138de78c698a53b5183194cd847b92975babf3187b4bec2f7f9f3c038fb11213f78f54ed6409bc41b63cc33bfae91295292eb95d2fdda97179cf89cab21d164c0f333be31d44e2470fec12b9005e5fe3c68e4674a0c1fcabdbba73224a0edfa425a2874b0cd217e39314ef10c4ed227aab1bd35ff0cca8ab2a079894516dea7cf04bc452ac6db593d826f4266d6f80cff9f135b50c9af27ceb7f4e4fc4b53c2022e7bf9af2fa951730608f5ff9994977e6c474ce9dc4251a8fdc42d315a2cc8f42ae622df67a9bba5591d6d53e3ee38e831bedc13d891fd90c96e861bdb084cadccfb8828b3fcc96e1b22e8931509f843afd7268660cf3d839cdcfdf0dd43bf80f6b19f6fa7c6c3c7aa807a8ec56930a4a6de6913da970543597a45121c592bdc46c7f0e5c16b0f606a70ae2e10b218fe931c6400f2b89618557eb377e27310ba06d19e81a86a57b26f8ad027511f837111e7c67925c647fd956ce64c847de30e0b49383f9ae7b52966fa69e6a4a7655f021b5ee122c67663f6dc88a7ccf9355f5fd6218ad22fc6a0089b4014e31b152ed186aec5a9327eb75f66cd7b33b5080d622e96a691d951dcee7babb098602199f2d7fa9e0bba7e6f805558c4b45124b225376b54891411c47cf756aa2e86d59726f1c4c91c25f952f30c570874ebd4f937b5c6673c85a38c4537b0aaab6c8831d1bcb5bf39876618acc443db5fd06ef0d71411a46f02c3c60546b97508065a02c09eca413aeec1fc7b2df3cea301cd9f23d833c4c6e06eee829c4d9da771c3a7c6c7528cf670da0b2d5c6f3e6c70c91cd806e7941824185a3c146f7b93ba9b7108f848162dcef28d249508d8c4dfff93718c49943734388bb2ae53f2222afd91b4773784fe169d293eb411b1de68a90149cf3ba20784d8fcc64b11174175bd67cb57cc22b03b7d829d51204684a0c434fb2bd8a10506ab6f1396fb2ac98e7f1a4499947439befd1b66e060eca58d38e1a3d29ec0d55a9fb9fa05a299062ed6ffa923a857fbaf0c726a07fe70861c02737cef4b744c386a606a264cf5a4046d0dc676600d09fa8b162ba7dc2179a42691498d7a4d511bf270c4c68cfc72486e8a36bfbb9710e2b49b63814d34ae35b708efc4950238e63d1823a7f34acf66d519ec7d198f8520bfcea905ea395a81263af900b1aa38f28fd31d4a654d36c94abd1f4512b50f6944d7d970f99414f1f71a24c3ad196163344805173fc17cb7c9f26bd3fb440c8bd8c7cd08d24a33909a35fb54ebf16674e9102d9bc68681f78825820f4be756d2b709e7086bb5ae98156a0a2779b5ff173e7b5fa0bfe3b3fbd4e780054ca177a38d5c1cf3d1912457966600038ca7dc0ebd4fe5b9744d8baa6d7f0992ed062bd9f34db763f6eb25b7e7cb84dff25ece91b761fcfa52e5a9651ffe61e462aa6a27d1b63e1421ded17fba8423f78c4d706f8797f5126bc6fdf7ab5a74ca262a29ea0ce5ac62ba9bc3b065a7fc0233680a25325f60fb8865e5ab5569f50198799c4977b2a0036fc2b084d2f48d04d5f4b4db3ad8620fa7d153ef8ef07513aa71f37636a4ad7f86deb576cf84cb04b59b569b7fca2c06a92e8deb03a396e56f3ad4a88757c6e4058d691265cbe393822bd1b5855b3dfc36a0c6a5b2f025566378827eee9a2004fb6de4a086f9e445cf510e7b79c31b3ec6f8d064367eac2fbeb7ca10edc0a334dc7801e073192e33130d4d1a42f093ad60b37b3ce3ce3d3cd93f37a1bf1e7ebbcb8cd0f43d02a39d9ceb8baad231c796c87498f3517b0931fe64c10668ccafbf2d449b81c997300bae92d7d9757dbbd95f2cd4c6a3c4e9c527fda5828bea57452af09945d443c70d621a9d67dcb91a8fe8d61809fa1a2e4b6b05b234ab491f2aab7c1d1aa7e7ce5983007126cea78f112404a8ee2235f6963af1259df1926e19d939c54393b4968e31a820ce96925d8508fd35bbc5c673992c76180b36c86e1bab2358a625945c841b1c11ec4dcbf0c44db601a8c6628783ab2fb8b5770f04440ce17e6d515f37c7aef5bb3432eb269f74ad4793b21505793656f2d964002e8f66de38ecf4ec8bddcb82db0bf2c3510126a14984278222a286e30808ddf08c0a43bd59f4c7b4cb0e7c915df93be3e52cb1c84c6b03c86c84d94cb4ea9855aeb823bd2dfab68ded2e09510341c7eb26bc1da451bd33c61246495be6bedeb4e22f904845f306b4674dc0e7858f557f2716cd3b65f0b8f7f972b2d303f78765b608ae7dc9533258b2076946c07e859e6dc4f46c0e325e500429266b6e259b301102631fac57a5377d7d833904ec49998fa82d06582b4892897ccbbe9b597cd1217340d7e4d705648ad1888ab4b1aa9bcf96cfba5ed5ed69c696b60f205f81389ff7816a758e65167ac94cdfbee2f756d6d597270e01ed7bbd983866541689f3fb3563471687923dedd7bb7607292e67a0aa094be3d87ee4de0a854d1746e049632df1f8ac51f46c5d9d706e7574281cfd6987d0b5b9e06f5180dd1075b79b2fd2471a7ae885f7cbd721eb7bec9bd67b86f1b668212eeb7d0fc654ff6f951cebe2f4fb090223f32acf3eb72fef3ce24527f45863e359f834cba51edefadd1f2d8f5cc4cb679904ed554e58bbcd5520af91b8b0b998640571397236b48a8787d8828913d30d150cfe0b54c9f0d25716668637b6f0bdb0eaebe3f267ec830b92ae2a4d76836f73593ab59b11060c9c9bfe44ff15537c20374ddc2cc65348f915ac97d836c36c829d66bb21e8b72676fdcc56134ffd35be29cd5775272c549b9ddf05266e1db452a24aefe6d4656bc27db0a3a4a1f0516913f6e60fe5e88c4ab5e09578a6712215fb6f1214d7b9281e25e9a0e9b4c94e2d6d752030738a190043929198e60a6c2994c0bb8e1e2e42aaf8975802f7035382303d562b0dc67ed391d911981e6c51c096dc95207d7061791552f96192924a16e9567c1cf41bd59b8e9c3100ae4ed4d773bddc1df3b1abdf17dbfe8095ddcbcc9f6b1a8b6f722b6aea6bbfb1de0bb445b45e91e271a8c162b5c4e89c2054b33878702391702d1b5717dc0347c8305c3a8511d0532c3daaba569f6e2657e8a1b6ccae013b3642c640681f12806dd40246af2cff0031f9dccdd8e2b943b6d25e6984e4f80355de76af4f3df39b6383666caaf0e247d684edc4ae78d6a87e50c35ef431e1e7329c2a5c23921ec4ceddd355b328ed67a6da05764596a325de7b1aa85fb9c1ab11670d37668f2ddef794ca976c5ab728ec906ad765e2eb0c69dd8fa3f7b19a3167e3f6c6b1271e50c8c7ebca1f52116a930edffbec527d09341f1b329233fc03f5e5b2131ad0929cbda0b29a2b4d49e772710c5ec27836d982a06630fae38f3cf13c566ec22ddda079b945fda85b04b7a437a4f841bd8c238e8d7f7657006208c299dd692f98df311e9c8f61c0ba4fdc18d4a600119b9e7208de45d2e653696d019ffc61c68e66605608d85070038dede5684aac2aeb5d1779e68ce5f08bb78e334fbd015edbdaf368561f086f804fa8b6ef3dea87b9afd5d1a2f0e86d25cc808c8fc9b83e1fee2756ec146329b67e6352d555db25ed996e38feba2d7e1834baba3baaac5cb0251d2e635ebb8eecb587f49dff4fdf70cd997bec9e53b03356aaf9265aca7dc61315ff8027c30b99d5289a416083ea7efd2bf6a4e9ffbc9eea4fca3ff6c77d37a62663644a2e14f809b971fd0a0b5d65b1236ab9edc6c43bb3aa1e30a05da06ebbd748de424813b672be7b1f1f8fc996db111d06ba18aca1616433c4c9d3f0b329294d070d0aeb06a77d67bf547071551c74c741c565656d02783ed5478b2c32c6c7a98a70cb66853e3d4126427ae7dea4a804400be98e741b66544c7042fe6f0baed0637274814ac3261b20a2d4eaf7f6895d7c0b4c5c9a56bcf6466546e99ae9182202579cbfe7af2d2636f811ce196b9da607212de542ac583851f67b777484a997c18f6a2798ae252654a23993e475848858e94dd62ddf507e393237e88095c6e36bd8ce3480aac08f5f09819cdcf8548d8dbc998e50e510991768ab503bc7595b3c1759094610bb5ab57c3869dfe89e6a96d61b2511a6f7bab9041e5c64aa9d3085e4e1f31a7ccb160f56219b0eb9e4bfc505a711e9b1ab714eb82bc2370eb8957df175476ce90c041086683e9aa40dc7ec525b45204deaa2c6bb122439ab93c6a4ce29ceff5c7cf0ca67579c87664d0dfd35188bb96f199f87d12cc8539d4ac24d7ae50a7e6f0554ec89d9ba7a350252135400d19a65537d18bf4aa0b9550ff006fa889064299a4b14798116d48b206b29375d493477d49ec6984eb76655f4f1f82543d1c1b8f24fe02be105902c2a9e34ff35cfdc139592c5b10afdb3939e73c656b6233e46722e2bc8570a4662d273369cd1953572841aba52813aec46f5301a64b3d3cae4b3352d196bd7892222af6394bee2fbd38a7a8bb5b4c6e4db86a5a6b8db2050806f78ccf33356f532a62c053b115ff5a1f881d903ff0b2b56675602ee82929cd4c442a67bb0b7774689e9a9e4ab902f3fe15a38fb820b53f8505d07c6f5a81d34b37130b81d90db571bc6caf108965f3fa3e610f56d7862e8631070eca55ff4ac058a717fec6c978bb274b8395fe6e0532081b80b00bf90974c6628a6f8a125deea0b6a02acce703535c08303deb1f38c0b37d095ec3565eb5ca01e82084a4412f5d9bffc575b87d31790f9750a899ea988be0eddf6d8d9118efaec88c6aa79535acd83f189d70272a2f549bcaec365c1f90b185fc5a738815f17083324bf13cb205c8aa31fcd660268cad714c422cf9408c17440cfd4385ede98d6bd0386f6123f0a2650a2d9b8cb24e5e1a3309d7489fad1f7f7d55a2aedf4a1ea0432cc11c4edb0fafe454d7ed516fd75689555257ad69d1c18e6ef083a0962f0712cc64f649a22a984eaf57c8489289d40ce8ac9c4e09b4f4b5178b370f6c9396bd86a28e644868ca472e0d554a0afb690cfd7da200eb8d1c92788bfe0de01e3cbeee0f4c40e06c322df1b998e78658354d96d91e02dbb8cc0c462df0319bc58070bfeae9b84ac12ffa3bebea9965762f0a41e8ee0a7588ac99cd6815bdc3d6e3035d2c6e05800c42140a8194832d231d17c17f8e78e729f256b24d1ff6f894cd37b34aa056ca0779359b8a2872ec567285d6385116f7b8183f008e160ceb23a0f1eac8b59c8326a1d3154f5e89a0467705ff26a27a7e34d9b386d55182a70ccb9ef9416ce0bf09f846cfc82f58bf3113e666157fb44a274e8213935e635ed013900f2b0c62c589b84b64d8fdde5498482cc7d15768c856365091463a45bd013d68363a133b04e636fc61e1e7bde435449e46a0819936e9eb68d1543a4405cf15c779a1cd64c28a254e2a5f98ca1e88f9b9f81939b1942ae51e5f5995d1f7a982141bb39cd6cbd5ae3cac0b13532f939dfa6d012ea667afd7371e58cb8bf7c358d22b2c007c69ddc2f5a0515e0441d99ac013a840a4b1e9af05827f77ab3cde5d24982a87eeb3554b20af5925d952703540b8ac26f03f7406a2700d87c2b9ca8ad4f2651a920ff74ed6b4f2fac91a86d01cf2fce2763210b0f05f954170cd586d33a69c61763a6de2ef4e4e16d3fde5e2008fed8ca18e0372850590f64301d6c99b58db029e7c60e4306d7c9d02cab55dfe5e2b67f861e772ea290d4e7da05ade93fcb28c6a7dbca8807d05a1498a672ff8218871af9f771352b112effdde4db7af628575ac486c76b903c7c0a17f8bfbc85b48c47f7a5a20dc16ad243f9cb7cd2041bcaa1df0b31696bbe72069bfcf6386b1a60a608c721f1915f1e47aaa178209e0307601d8dc6e38666b71f20a3e04c7c111d81f57a51d3595da5a17e6534ae0d9849d5fbd7075001af72fe144475b5519a05251e0d438e71d1bd792d9643befc1bd9f3f0f556c57ae0a93f7fef7ecb9946428b9666814d4bdc9cf6fbd3d0266fc86bab03d51d0b5f5700f753156f30aa9671559a851adcff0de6d7066a8cb9baf0b69c9c63e2c60b4760a8a6e584d8a87139f37cf26a10025040ebd54d95a91586dbeb56dd2e0fdca58f8a277d9657efdb52125e08e251efdf7602d9ebad1341971ab2385a74296b49ee077d4c62d071b866d879b56a5d869015971de7bbf60810f911dc2a9edcddecc055a04af40736e619f581c430a810cf8a035cfded025285705e1504cacac62b9e8cfa28bb532ccb8be37aefc5fa2f26015d2536038d53f53c01332dc5501f3d525cd3ac7269ed41bbae9f42a29597e0f0ffc478e7a8590fe82f409c888ce457c5bf11da4cf71714665afbf1bbdc121c1883e18e574c75d26dae74ecebbef6d6111d179ffb6f9d94bb31a2959663060243e15aacaf159645efd55784395d0ac691012bdf09c0e4bcf34aebaa5e89e208db21aae3a4cec091f3e8f21152dcefa463a2de0949c62884a12c0d11671613750f8638e4b433030de2b196661dd68bc79e053aa0403b2e0e736e7d9f5c5ecf4edb51d036f3eec15d55723f62e8336f466b54880777b74e749e26368885dd5a21a63a4fa844871bc5827dd3e9a9db3daec67941144535f96113278f1653fff74e2d9a467a025ee3564743e41aa13e1c80e625ecc13612c14108ea761f88246796a5145b98942890199411136f8120ea940e7bc108988d3a6805782155597307f5f8fa762a3e61111c02d720e190e2b59a60452eb421940fb3893f37b067de43ab0a9c91456b251fe9200408cbb2c6129fcdc6edc6a2c998402668a13913e413c8d108ebef417103f8cfbc05374457a1e73df6bd6713b9f16b5c59b62eda23296f46e6b0070e2b366455523a99396c6f2164f7b763c3cea820d1e3a8a42882f9e8f0779b3993c88ecdce0b60f6f992303a8532af219a3f861b8516c3d6eb3d84635703f228adf3f31b600bc9c67e4a1ccf3dd5c67112e3b3f5ae0869c97bf20f673960c7007ec838e4af9384051a3ebc70faad3d06ec7682acf74b5667ba8abd92dfb1953cd65abb7f41bb8f974a5bb8bfdd94ec66dd3bb6b8cfc0ff5a6a60accefb97ecd6f6c8fca71f80a9ca8881ac466f5db60a99e9ae18c386e5929e8c2bd51ef00d90336909bfc1dadeb4cca794871b35c2c6bb3bb9dcbf76a4297ed21144ae0423b4857783b8bdc0e2783289d2c58b08ed95b28f5006a6f0c6cfc1aee05ea796137c6572b75d811832851e024aa86109a566576d17b79578431c9413e5c9d8a8c8200b9571ddc034f25d5616951358d0d141f1172ca390aa40a18c0b9b9ea6b59e153d4f9c4d57b5eab5227f613923afa3a1c6d9d319c0e26005bd93e0c49ae00c9fd39f39d9849ee726ecd7bf25257ecd36af220d3e1b6c22642b239e4ffb7cd7019eb73803ec335525eaab62ddcd249484fba2bf83c12d68b05e2563b9a5f5cc9743cd637e898704379ebf0a7ed5965807b21ed47b26542ab3fcbba9c2ae1b0afc74e0dc02534ef2daa4a3e6ae46a5ead29cc6c6e2e210c1e1754645c3e59f12e0e06b350cd88285de9ad91925adb2ff1012a8c456e3ec6fe36a696837abeb4b22984a98d914c9f7892bcff3afa7da0ff75e85c7e0f4a53992ba65a94cc6075d886d9ce0574e3fca01d48588c87f5b3b61347faaa76a0eed7ac1111a0ef4cf7c3444e013431c8bbc684607a1f9a3a7e15d5ddfc67395b0f24a009b937f5d590f1016cd4b070d5fda0e3e26ddef083a6b40b913da9cf68df0f8c66032622c6b2732621f1a6180ab156fd6a00d8f19addcaf0637384efda8df0444e05e0fde6af8b9ae2b2c0498a75dbf70491b5269628dc21580913e42bf21d60b06ecc56db795c2fdac172bba18257f8ea6203a23cf790de9d264c6cbe13775f2cc90b682206e30182342a5296b4d7df6f970dae3392bf3832c84fd4b78ca84442f4715615343a6daca7267b133ec570cbbe2b5e54e97f3ba51b7eb2833558903ba549235fa94004ee3efe11289f04e324766e37498ab1ff93177a2c959abbea5f0dfcb2417f8d232fe107f87cdf6b9dd4d43036715a55e61a63f90c67d24cf4400001500015708af01211a8fffffffffb9376ba2d868961a3b0684c143808f60ae6fe952bc57c71bdb84aab0ccc84a0ed22991430382dd2cd756203eb51bebaba2811c63fcc72e3915140a7cad4c52b389f2b83458b4a91b255d598781ec5fd2aa4e4f9325b3a304ca127d07115c7b26fe620df58c97e4f5ae81e95f059d948bebf7a0d87cb534c43a46879c4b4dd41875d098201c3c6d6f2f9bbee01ebeb7919de9ab75ba4299f5ee32f1ffb8cf40f57d8010c8b323f7291096bf9de3f2602952c94cf228b718a8366feac6c3b19cb0ad91c64ba89bbcbcded8d2aad110d90a432f4bb758dcafbe6db185b839d0495c88e8f88335cd8b0d1973087264c069a94a5800a6a40a74d1c4323f7bc4a0a285b2ba2594a87cf37b7e028e4dcecad2ffac07a2fa157b313a5253b288c97ae4f5b7f2bdfbb284f398576706a6e777ff25f733b941d7518ae635705cb30810a10ca840ab960bf3a01cfe842291d36490cf4400001500015508af01211a8fffffffffb92971a630a02c141305080201b91f4a525ef6d6a554556b795500ed0210772496125313298a8307fe5f5960e7eb4ae138536af92d7be1cef31642af74a084c9d466f1e7e71d813d70e8d1e946f18e5f3ba2f56b1a6271529e9f41865c5b75e9464aa949a66b87d87ab67b27b42eacd8066789d15286ecc41414468a3894defdd7707593c7697304a49f39ed3c118d47931326f97db048fcc1a8fcebaabc5aaaaceb3a96edcba3855365a41e6dc93472d3a5ac84784f02f15baa3de775511b2a78d369dd173a271a7b8f78ba303bf0e3c4035a07dd76e3ca4491950198c1c40fc11167eb175255974d3fc2d9787bb8884fb7161df412c141c4eaaaf7e41413b9cc2f664773f118d2981fd41e1fd35096fe760a560d6d8c0142f76a7dccdc41b6831ae9b5936d333267a868e704ab4ce2233fd2e69a4dd61950814102c30fe8d001f333007178d2954c7c8da535be460000210001f10927010000430000000209f0000001e2419f922e2e973b6f700902da280b8f19c01ab8ed6522cbb62c035c26a12ad183d60f83ec3440b690002520bfa4bbe2db760aa23c4a26ee680f844d2343c290e30f50809a3eac9a3f4bd2caf16850238f1862bc62f39c15a8ec649e6a81fa87e36668f99381d34789f42195158edfaba89ac6ffbd07b8d0eb24ce348398ac2780e5a0c5ec5255544218ce4698de19573ef895b824aec597c47d51123c4fa8e9dd5eb29cf98a9d0f7da88fb0a4a1098001d4c18fd06e61f57a5d99a89ba949436a01858dab5d604333293ea96a3f6a55d42edde8dbb3f52c8342b4e2cfd552f77dc3f0c76ebafdacb4763f995654122c8b97a0c6f7741d2dddd87a7c7f952870464778ba7c650607ba2c5755d3be1484c2219309f754db453bc7cb996809682d8dac26cbce7f55ac6f4249228bcc5fc14f793c12c9916808da40de5472648cf81c8b80e5aa87b49c3ead03669ce312ee6c0589afc9dea75b6e9743a56d657a9070f97858fa53c919ca46b4d0e52571a368049467c64876ad0b6b76ef97a453fe2fab2e069dad8f2f7252acd75d4108a654bc0c1b8c0752efcbc6ff62887af5b2e25b7268b498642d650562e3e009ae707b95b0a339fbc31ffb542f7aba1e2878d4c4695684436b47fd1ef6dfb09c9ff2eab5faf0bfe9bb474fe5f67292b2092c941f319a9420";

	std::vector<uint8_t> message_vec;
	HexToData(message, message_vec);

	std::shared_ptr<RtmpConnection> rtmp_conn = std::make_shared<RtmpConnection>(nullptr);
	rtmp_conn->UpdateState(EmRtmpConnectInitFinish);
	auto size = rtmp_conn->PushRtmpData(&*message_vec.begin(), message_vec.size());
	INFO("result size : {}", size);
}

int main(int argc, char * argv[])
{
    testing::InitGoogleTest(&argc, argv);
    LogModuleConfig config;
    config.m_log_level = "trace";
    config.m_file_name = argv[0];
    LogModule::Instance()->InitModule(config);
    return RUN_ALL_TESTS();
}
